// 统一错误处理工具
import { Modal, notification } from 'antd';

// 错误类型定义
export const ErrorTypes = {
  NETWORK: 'NETWORK',
  CORS: 'CORS', 
  API: 'API',
  TIMEOUT: 'TIMEOUT',
  UNKNOWN: 'UNKNOWN'
};

// 错误分析器
export function analyzeError(error) {
  const errorInfo = {
    type: ErrorTypes.UNKNOWN,
    message: error?.message || '未知错误',
    suggestions: [],
    technical: error
  };

  // 网络连接错误
  if (!navigator.onLine) {
    errorInfo.type = ErrorTypes.NETWORK;
    errorInfo.message = '网络连接不可用';
    errorInfo.suggestions = [
      '检查网络连接',
      '确认 WiFi 或移动数据已开启',
      '尝试访问其他网站确认网络状态'
    ];
    return errorInfo;
  }

  // CORS 跨域错误
  if (error?.message?.includes('CORS') || 
      error?.message?.includes('fetch') ||
      error?.name === 'TypeError' && error?.message?.includes('Failed to fetch')) {
    errorInfo.type = ErrorTypes.CORS;
    errorInfo.message = '跨域请求被阻止';
    errorInfo.suggestions = [
      '确保开发服务器正在运行 (npm run start)',
      '检查代理配置文件 setupProxy.js',
      '重启开发服务器',
      '清除浏览器缓存',
      '使用 Tauri 环境 (npm run tauri:dev)'
    ];
    return errorInfo;
  }

  // 超时错误
  if (error?.name === 'AbortError' || 
      error?.message?.includes('timeout') ||
      error?.message?.includes('超时')) {
    errorInfo.type = ErrorTypes.TIMEOUT;
    errorInfo.message = '请求超时';
    errorInfo.suggestions = [
      '检查网络速度',
      '稍后重试',
      '使用模拟数据进行开发'
    ];
    return errorInfo;
  }

  // API 错误
  if (error?.status) {
    errorInfo.type = ErrorTypes.API;
    
    if (error.status >= 400 && error.status < 500) {
      errorInfo.message = `客户端错误 (${error.status})`;
      errorInfo.suggestions = [
        '检查 API 密钥配置',
        '确认请求参数正确',
        '查看 API 文档确认接口规范'
      ];
    } else if (error.status >= 500) {
      errorInfo.message = `服务器错误 (${error.status})`;
      errorInfo.suggestions = [
        'API 服务暂时不可用',
        '稍后重试',
        '联系 API 服务提供商'
      ];
    }
    
    return errorInfo;
  }

  // 其他错误
  errorInfo.suggestions = [
    '查看浏览器控制台获取详细信息',
    '尝试刷新页面',
    '使用模拟数据继续开发'
  ];

  return errorInfo;
}

// 显示错误通知
export function showErrorNotification(error, options = {}) {
  const errorInfo = analyzeError(error);
  
  notification.error({
    message: '操作失败',
    description: errorInfo.message,
    duration: options.duration || 5,
    placement: options.placement || 'topRight'
  });
  
  // 在开发环境下输出详细信息
  if (process.env.NODE_ENV === 'development') {
    console.group('🚨 错误详情');
    console.error('错误类型:', errorInfo.type);
    console.error('错误消息:', errorInfo.message);
    console.error('解决建议:', errorInfo.suggestions);
    console.error('技术详情:', errorInfo.technical);
    console.groupEnd();
  }
}

// 显示错误对话框（用于重要错误）
export function showErrorModal(error, options = {}) {
  const errorInfo = analyzeError(error);
  
  const content = `
    <div>
      <p><strong>错误信息:</strong> ${errorInfo.message}</p>
      
      ${errorInfo.suggestions.length > 0 ? `
        <p><strong>解决建议:</strong></p>
        <ol>
          ${errorInfo.suggestions.map(s => `<li>${s}</li>`).join('')}
        </ol>
      ` : ''}
      
      ${process.env.NODE_ENV === 'development' ? `
        <details style="margin-top: 16px;">
          <summary style="cursor: pointer; color: #1890ff;">技术详情 (开发环境)</summary>
          <pre style="margin-top: 8px; padding: 8px; background: #f5f5f5; border-radius: 4px; font-size: 12px;">
${JSON.stringify(errorInfo.technical, null, 2)}
          </pre>
        </details>
      ` : ''}
      
      <div style="margin-top: 16px; padding: 12px; background: #e6f7ff; border-radius: 4px;">
        <strong>💡 提示:</strong> 如果问题持续存在，可以尝试使用模拟数据继续开发，或查看 CORS_TROUBLESHOOTING.md 获取详细解决方案。
      </div>
    </div>
  `;
  
  Modal.error({
    title: '网络请求失败',
    content: content,
    width: 600,
    okText: '确定',
    ...options
  });
}

// 创建错误边界组件使用的错误处理器
export function handleComponentError(error, errorInfo) {
  console.group('🚨 组件错误');
  console.error('错误:', error);
  console.error('错误信息:', errorInfo);
  console.groupEnd();
  
  // 可以在这里添加错误上报逻辑
  if (process.env.NODE_ENV === 'production') {
    // 上报到错误监控服务
    // reportError(error, errorInfo);
  }
}

// 网络重试工具
export async function retryRequest(requestFn, options = {}) {
  const {
    maxRetries = 3,
    delay = 1000,
    backoff = 1.5,
    onRetry = () => {}
  } = options;
  
  let lastError;
  
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await requestFn();
    } catch (error) {
      lastError = error;
      
      if (attempt < maxRetries) {
        const retryDelay = delay * Math.pow(backoff, attempt - 1);
        console.warn(`请求失败，${retryDelay}ms 后进行第 ${attempt + 1} 次重试...`);
        
        onRetry(error, attempt);
        
        await new Promise(resolve => setTimeout(resolve, retryDelay));
      }
    }
  }
  
  throw lastError;
}